using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;

namespace Manaddiction.UI
{
    /// <summary>
    /// 一个切换按钮组件，用于改变标签面板
    /// </summary>
    public class TabButton : MonoBehaviour
    {
        public string group;           // 按钮所属的分组
        public bool active;            // 当前是否激活状态
        public GameObject highlight;  // 高亮显示对象
        public UIPanel ui_panel;       // 关联的UI面板

        public UnityAction onClick;                // 按钮点击事件回调
        public static UnityAction<TabButton> onClickAny; // 全局按钮点击事件

        private static List<TabButton> tab_list = new List<TabButton>(); // 全局按钮列表

        private void Awake()
        {
            tab_list.Add(this); // 注册到全局列表
        }

        private void OnDestroy()
        {
            tab_list.Remove(this); // 从全局列表移除
        }

        void Start()
        {
            // 获取按钮组件并添加点击监听
            Button button = GetComponent<Button>();
            if (button != null)
                button.onClick.AddListener(OnClick);

            // 如果初始为激活状态，则显示关联面板
            if (active && ui_panel != null)
                ui_panel.Show();
        }

        void Update()
        {
            // 更新高亮状态
            if (highlight != null)
                highlight.SetActive(active);
        }

        // 按钮点击处理
        private void OnClick()
        {
            Activate(); // 激活当前按钮
            onClick?.Invoke(); // 触发按钮点击事件
            onClickAny?.Invoke(this); // 触发全局按钮点击事件
        }

        /// <summary>
        /// 激活当前按钮
        /// </summary>
        public void Activate()
        {
            SetAll(group, false); // 先禁用同组其他按钮
            active = true;
            if (ui_panel != null)
                ui_panel.Show(); // 显示关联面板
        }

        /// <summary>
        /// 禁用当前按钮
        /// </summary>
        public void Deactivate()
        {
            active = false;
            if (ui_panel != null)
                ui_panel.Hide(); // 隐藏关联面板
        }

        /// <summary>
        /// 检查是否处于激活状态
        /// </summary>
        public bool IsActive()
        {
            return active;
        }

        /// <summary>
        /// 设置指定分组所有按钮的状态
        /// </summary>
        /// <param name="group">分组名称</param>
        /// <param name="act">激活状态</param>
        public static void SetAll(string group, bool act)
        {
            foreach (TabButton btn in tab_list)
            {
                if (btn.group == group)
                {
                    btn.active = act;
                    if(btn.ui_panel != null)
                        btn.ui_panel.SetVisible(act); // 设置关联面板可见性
                }
            }
        }

        /// <summary>
        /// 获取指定分组的所有按钮
        /// </summary>
        /// <param name="group">分组名称</param>
        /// <returns>按钮列表</returns>
        public static List<TabButton> GetAll(string group)
        {
            List<TabButton> glist = new List<TabButton>();
            foreach (TabButton btn in tab_list)
            {
                if (btn.group == group)
                    glist.Add(btn);
            }
            return glist;
        }

        /// <summary>
        /// 获取所有按钮
        /// </summary>
        /// <returns>全局按钮列表</returns>
        public static List<TabButton> GetAll()
        {
            return tab_list;
        }
    }
}